Godot 4.0: Noise を使って Screen shake
https://gyazo.com/102f5128d8ad5474995c5d18aaae1577
Godot 3.5で使えた OpenSimplexNoise クラスは削除され、代わりに FastNoiseLite クラスが導入されているのでそれを使う code:gd
extends Camera2D
class_name PlayerCamera
## noise screen shake を実装
@export var CAMERA_OFFSET: Vector2 = Vector2(128, 120)
@export var NOISE_SHAKE_STRENGTH: float = 20.0
@export var NOISE_SHAKE_DECAY: float = 6.0
@export var NOISE_SHAKE_SPEED: float = 15.0
@export var NOISE_FREQUENCY: float = 1.0
@onready var rand := RandomNumberGenerator.new()
@onready var noise := FastNoiseLite.new()
var noise_i: float = 0.0
var shake_strength: float = 0.0
func _ready() -> void:
rand.randomize()
noise.seed = rand.randi()
noise.frequency = NOISE_FREQUENCY
func apply_noise_shake() -> void:
shake_strength = NOISE_SHAKE_STRENGTH
func _process(delta: float) -> void:
shake_strength = lerp(shake_strength, 0.0, NOISE_SHAKE_DECAY * delta)
self.offset = get_noise_offset(delta) + CAMERA_OFFSET
func get_noise_offset(delta: float) -> Vector2:
noise_i += NOISE_SHAKE_SPEED * delta
return Vector2(
noise.get_noise_2d(1, noise_i) * shake_strength,
noise.get_noise_2d(100, noise_i) * shake_strength
)
カメラを揺らしたいタイミングで、
get_viewport().get_camera_2d().apply_noise_shake()
を実行すると、揺れる
各種 export しているパラメータで揺れ具合を調整できる
パラメータ調整用の専用シーンを作ったほうが便利
ボタンを押したら Screen Shake を実行するデバッグシーンを用意する
https://gyazo.com/368c300b3baf019a08e4e94557e914b2https://gyazo.com/8125db4020ca230069f8cc4ccf4e291c
インスペクタで Screen Shake スクリプトの export したパラメータを変更すると、ゲーム起動中でも反映される(デバッグオプションで、スクリプト変更を同期にチェックを入れること)
https://gyazo.com/e08cbb74758f19b594340d70533df246
スクリプトで使用しているパラメータを変更して確認
@export var NOISE_SHAKE_STRENGTH: float = 20.0
揺れの強さ
大ダメージを受けた時ほど値を大きくすると良さそう
揺れが激しいほど、画面外の領域を描画することになるので注意
画面外の何も設置していない無の空間を表示する可能性あり
@export var NOISE_SHAKE_DECAY: float = 6.0
揺れの減衰値
小さいほど減衰が少ないので、揺れが長く続く
0にするとずっと揺れる
@export var NOISE_SHAKE_SPEED: float = 15.0
揺れのスピード
強さと似ているパラメータ
スピードを早くしても画面外の領域をたくさん表示することにはならない
@export var NOISE_FREQUENCY: float = 1.0
揺れのきめ細かさ
小さいほどスムーズに、大きいほどラフになる
FastNoiseLiteクラスには他にもたくさんパラメータがあるので、必要に応じて調整する
参考記事
https://www.youtube.com/watch?v=RVtcnkuNUIk
とても分かりやすい動画と記事で、こちらをベースにしてすぐに作れた